3.【SpringBoot3】文章分类接口开发 您所在的位置:网站首页 springboot 接口开发 3.【SpringBoot3】文章分类接口开发

3.【SpringBoot3】文章分类接口开发

2024-07-10 11:20| 来源: 网络整理| 查看: 265

文章目录 序言1. 新增文章分类1.1 新增文章分类基本代码编写1.2 新增文章分类参数校验 2. 展示文章分类列表3. 获取文章分类详情4. 更新文章分类4.1 更新文章分类基本代码编写4.2 分组校验 5. 删除文章分类

序言

在文章分类模块,有以下接口需要开发:

新增文章分类文章分类列表获取文章分类详情更新文章分类删除文章分类

数据库表字段和实体类属性:

在这里插入图片描述

在数据库表中,create_user 来自于 user 表中的主键 id,是用来记录当前文章分类是哪个用户创建的,有了这个字段,将来用户在查看、修改、删除时就只能操作自己创建的分类。

1. 新增文章分类

需求分析

当用户点击左侧“文章分类”时,会在页面主区域展示文章分类相关内容,页面右上角有“添加分类”按钮,点击该按钮弹出添加分类的弹窗,用户需要输入“分类名称”、“分类别名”,最后点击“确认”以访问后台接口来完成分类的添加。

在这里插入图片描述

接口文档

在这里插入图片描述 在这里插入图片描述

1.1 新增文章分类基本代码编写

接口实现思路

CategoryController 中添加一个用于新增文章分类的 add() 方法:该方法上不添加请求映射路径,因为会在 CategoryController 上添加 “/category”,且方法之间会通过请求方式来区分;add() 方法内部调用 Service 层新增文章分类的方法;Mapper 层编写 SQL 来新增文章分类。

在这里插入图片描述

代码实现

完成代码编写之前,首先新建所需的包、类或接口

在这里插入图片描述

(1) Controller

@RestController @RequestMapping("/category") public class CategoryController { @Autowired private CategoryService categoryService; //不添加请求映射路径,方法之间通过请求方式来区分 @PostMapping public Result add(@RequestBody Category category){ categoryService.add(category); return Result.success(); } }

(2) Service

//Service接口 public interface CategoryService { //新增文章分类 void add(Category category); } //Service实现类 @Service public class CategoryServiceImpl implements CategoryService { @Autowired private CategoryMapper categoryMapper; @Override public void add(Category category) { //完善属性 //创建时间、更新时间 category.setCreateTime(LocalDateTime.now()); category.setUpdateTime(LocalDateTime.now()); //创建人id Map map = ThreadLocalUtil.get(); Integer id = (Integer) map.get("id"); category.setCreateUser(id); categoryMapper.add(category); } }

(3) Mapper

@Mapper public interface CategoryMapper { //新增文章分类 //不用插入id,数据库会自动生成 @Insert("insert into category(category_name, category_alias, create_user, create_time, update_time)" + " values(#{categoryName}, #{categoryAlias}, #{createUser}, #{createTime}, #{updateTime})") void add(Category category); }

postman 测试:

首先,在文章分类这个集合下配置最新的 token 令牌:

在这里插入图片描述 测试: 在这里插入图片描述 在这里插入图片描述

1.2 新增文章分类参数校验

在上面的代码基础上,如果不填写 categoryName,postman 测试时会报以下错误:

在这里插入图片描述

这里是 Mapper 层报的错误,说明请求已经通过了 Controller 和 Service 层。实际上,如果用户没有传 categoryName,应该在 Controller 层校验时抛出异常,而不是任由请求继续。

接口文档中指出 categoryName、categoryAlias 两个参数不能为空,因此需要对这两个参数进行校验。接口文档中对于这两个参数的说明:

在这里插入图片描述

参照上篇博客【用户模块接口开发】的 4.2 节借助 Validation 完成参数校验:要求字符串类型非空,在成员变量上添加 @NotEmpty 注解即可,另外为了使该注解生效,还要在对应方法参数的前面添加 @Validated 注解。

在这里插入图片描述 在这里插入图片描述

postman 测试:

在这里插入图片描述

2. 展示文章分类列表

需求分析

当用户点击左侧菜单栏中的“文章分类”时,右侧页面主区域会展示出当前用户创建的所有分类,展示这些数据需要调用获取文章分类列表接口来获取。

在这里插入图片描述

接口文档:

在这里插入图片描述

接口实现思路

在 CategoryController 中添加方法 list()。因为展示文章分类列表是查询操作,所以有主体数据响应给浏览器。在接口文档中可以看到,主体数据是一个数组,数组中有多个对象。在 Java 中,数组可以声明为集合 List,结合本节的场景,该 List 中应该有多个 Category 对象代表多个文章分类。所以 Result 类中 data 的类型是 List。 方法内部调用 Service 层,Mapper 层执行响应 SQL。

在这里插入图片描述

代码实现

CategoryController 中:

//文章分类列表查询 @GetMapping //展示文章分类列表是查询操作,所以有主体数据响应给浏览器 //在接口文档中可以看到,主体数据是一个数组,数组中有多个对象 public Result list(){ List cs = categoryService.list(); return Result.success(cs); }

CategoryService 中:

//Service接口 //文章分类列表查询 List list(); //Service实现类 //文章分类列表查询 @Override public List list() { Map map = ThreadLocalUtil.get(); Integer userId = (Integer) map.get("id"); return categoryMapper.list(userId); }

CategoryMapper 中:

//文章分类列表查询 @Select("select * from category where create_user=#{userId}") List list(Integer userId);

postman 测试:

在这里插入图片描述

测试成功。但是,现在有个问题,后台返回的数据中,createTime 和 updateTime 的格式与接口文档中的响应数据样例不同。

实体类对象转换成 json 字符串时,如何指定日期的格式呢?需要借助 @JsonFormat 注解。

在这里插入图片描述

此时,响应数据中的日期格式就符合要求了:

在这里插入图片描述

3. 获取文章分类详情

需求分析

在分类列表中,当用户点击某一条分类后面的编辑按钮后,会弹出一个弹窗,弹窗中展示了被点击分类的详细信息,包括分类名称和分类别名。这样,用户就可以在原有信息的基础上进行修改。如果想要展示被点击分类的详细信息,就要访问“获取文章分类详情”接口,拿到数据后再去展示。

在这里插入图片描述 接口文档

在这里插入图片描述

接口实现思路

CategoeyController 中声明 detail() 方法用于获取文章分类详情。从接口文档可知,响应数据中的 data 是一个 Category 对象,所以 detail() 方法返回值是 Result。该方法上声明一个参数用于接收前端传过来的分类的 id。 方法内部调用 Service 层的方法完成查询,Mapper 层执行相应的 SQL,根据分类的 id 进行查询。

在这里插入图片描述

CategoryController 中:

//获取文章分类详情 @GetMapping("/detail") public Result detail(Integer id){ //根据点击的文章分类的id进行查询 Category category = categoryService.findById(id); return Result.success(category); }

CategoryService 中:

//根据id查询文章分类信息 Category findById(Integer id); //根据id查询文章分类信息 @Override public Category findById(Integer id) { Category category = categoryMapper.findById(id); return category; }

CategoryMapper 中:

//根据id查询文章分类信息 @Select("select * from category where id=#{id}") Category findById(Integer id);

postman 测试:

在这里插入图片描述

4. 更新文章分类

需求分析

在这里插入图片描述

接口文档

在这里插入图片描述

4.1 更新文章分类基本代码编写

接口实现思路

Controller 层,根据接口文档,需要对 Category 的属性 id、categoryName、categoryAlias 进行参数校验,所以要在参数上添加 @Validated。方法内部调用 Service 层更新头像的方法,Mapper 层编写 SQL 来更新头像。

在这里插入图片描述

CategoryController 中:

//更新文章分类 @PutMapping public Result update(@RequestBody @Validated Category category){ categoryService.update(category); return Result.success(); }

CategoryService 中:

//更新文章分类 void update(Category category); //更新文章分类 @Override public void update(Category category) { category.setUpdateTime(LocalDateTime.now()); categoryMapper.update(category); }

CategoryMapper 中:

//更新文章分类 @Update("update category set category_name=#{categoryName}, " + "category_alias=#{categoryAlias}, update_time=#{updateTime} " + "where id=#{id}") void update(Category category);

根据接口文档,需要对 id、categoryName、categoryAlias 进行参数校验:

在这里插入图片描述

postman 测试:

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

4.2 分组校验

完成了前面模块的功能,程序中实际存在一个 bug。在实现“更新文章分类”功能时,我们在 Category 这个实体类的 id 属性上添加了 @NotNull 注解,这就意味着前端在传递数据给添加了 @Validated 注解的 Category 实体参数时,id 不能为空。但是,“新增文章分类”时,前端只需填写 categoryName 和 categoryAlias,无需向后台传递 id(是数据库自动增长的)。因此,虽然“更新文章分类”功能是正常的,但是“新增文章分类”功能却出问题了。

在这里插入图片描述

在这里插入图片描述

只要能将校验分组,新增有一组规则,更新有一组规则,然后在新增接口中使用新增校验规则,更新接口中使用更新校验规则,该问题就能解决。那么,具体该如何实现呢?

Validation 中表示分组需要通过接口来表示,定义一个接口就代表一个分组,现在有添加和更新两组,所以首先要在 Category 类中定义两个内部接口;定义校验项时,指定该校验项的归属分组(groups,类型是数组),可以给同一个校验项指定多个分组;校验时指定要校验的分组。

在这里插入图片描述 在这里插入图片描述

postman 测试,新增和更新功能都正常:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当校验分组的组数过多时,挨个向每个注解上的 groups 中添加其隶属的分组是比较麻烦的。此时,可以借助 Validation 的默认分组进行优化。

Validation 的默认分组遵循以下规则:

如果某个校验项没有指定分组,默认属于 Default 分组;分组之间可以继承,当 A extends B 时,A 就拥有了 B 中所有的校验项。

因此,代码可以优化如下:

在这里插入图片描述

未指定分组的 categoryName 和 categoryAlias 属性属于 Default 分组。既然 Add 分组和 Update 分组都继承了 Default 分组,那么就都包含这两个属性的校验;除此之外,Update 分组还拥有对 id 的校验。因此,将 Add 分组和 Update 分组添加到相应的 @Validated 注解上能够发挥预期作用。

5. 删除文章分类

接口文档

在这里插入图片描述 代码实现

(1) Controller

//根据id删除文章分类 @DeleteMapping public Result delete(Integer id){ categoryService.delete(id); return Result.success(); }

(2) Service

//根据id删除文章分类 void delete(Integer id); //根据id删除文章分类 @Override public void delete(Integer id) { categoryMapper.delete(id); }

(3) Mapper

//根据id删除文章分类 @Delete("delete from category where id=#{id}") void delete(Integer id);

postman 测试:

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有